package com.seafwg.designmode;

/**
 * @Author seafwg
 * @Date 2022/7/24 16:34
 * @Version 1.0
 * @description 模版模式
 */

public class TemplateMethod {
    public static void main(String[] args) {
        /**
         * 使用：生成子类的方法，子类继承了父类，子类具有了父类的方法，
         * 父类的方法中调用自己的抽象方法，自己的抽象方法由子类实现。
         * 生成的实例对象调用父类的方法，父类的方法中调用了自己的抽象方法，由子类实现
         * 也就调用了子类的实现的方法
         */
        SubTemplate subTemplate = new SubTemplate();

        subTemplate.getTime();

    }
}

/**
 * 模板方法：作为通用模板
 * 通过定义final的方法，在final的方法中调用自己的抽象方法，抽象方法由子类实现。
 */
abstract class Template{
    public final void getTime() {
        long start = System.currentTimeMillis();
        code();
        long end = System.currentTimeMillis();
        System.out.println(end - start);
    }

    abstract void code();
}

/**
 * 子类继承父类，并实现父类的方法。
 */
class SubTemplate extends Template{

    public static final int SIZE_LOOP = 10000;

    @Override
    void code() {
        for (int i = 0; i < SIZE_LOOP; i++) {
            System.out.println("seafwg_" + i);
        }
    }
}